<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="tool" content="leanote-desktop-app">
<title>OSPF(Open Shortest Path First)</title>
<style>
.tab{font-size:12px; margin-bottom: 10px;}
.tab a{cursor:pointer;cursor:pointer;display:inline-block;margin-right:10px;color:#000}#tab-html{color:#ccc}

.content-container .content-html{visibility: hidden;}
.content-container.html .content-markdown{display:none}
.content-container.html .content-html{display:block; visibility: visible;}
.content-container.html #tab-markdown{color:#ccc}
.content-container.html #tab-html{color:#000}
.content-markdown {overflow: auto;}
textarea {display: none;}

*{font-family:"lucida grande","lucida sans unicode",lucida,helvetica,"Hiragino Sans GB","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;}

body {
  margin: 0;
}

/*公用文字样式*/
h1{font-size:30px}h2{font-size:24px}h3{font-size:18px}h4{font-size:14px}
.note-container{
    width:850px; 
    margin:auto;
    padding: 10px 20px;
    box-shadow: 1px 1px 10px #eee;
}
#title {
  margin: 0;
}
table {
    margin-bottom: 16px;
    border-collapse: collapse;
}
table th, table td {
    padding: 6px 13px;
    border: 1px solid #ddd;
}
table th {
    font-weight: bold;
}

table tr {
    background-color: none;
    border-top: 1px solid #ccc;
}
table tr:nth-child(2n) {
    background-color: rgb(247, 247, 249);
}
.mce-item-table, .mce-item-table td, .mce-item-table th, .mce-item-table caption {
  border: 1px solid #ddd;
  border-collapse: collapse;
  padding: 6px 13px;
}
blockquote {
  border-left-width:10px;
  background-color:rgba(128,128,128,0.05);
  border-top-right-radius:5px;
  border-bottom-right-radius:5px;
  padding:15px 20px;
  border-left:5px solid rgba(128,128,128,0.075);
}
blockquote p {
  margin-bottom:1.1em;
  font-size:1em;
  line-height:1.45
}
blockquote ul:last-child,blockquote ol:last-child {
  margin-bottom:0
}
pre {
  padding: 18px;
  background-color: #f7f7f9;
  border: 1px solid #e1e1e8;
  border-radius: 3px;
  display: block;
}
code {
  padding: 2px 4px;
  font-size: 90%;
  color: #c7254e;
  white-space: nowrap;
  background-color: #f9f2f4;
  border-radius: 4px;
}
.footnote {
  vertical-align: top;
  position: relative;
  top: -0.5em;
  font-size: .8em;
}

hr {
  margin:2em 0
}
img {
  max-width:100%;
  display: block;
  margin: auto;
}
pre {
  word-break:break-word
}
p,pre,pre.prettyprint,blockquote {
  margin:0 0 1.1em
}
hr {
  margin:2em 0
}
img {
  max-width:100%
}
.sequence-diagram,.flow-chart {
  text-align:center;
  margin-bottom:1.1em
}
.sequence-diagram text,.flow-chart text {
  font-size:15px !important;
  font-family:"Source Sans Pro",sans-serif !important
}
.sequence-diagram [fill="#ffffff"],.flow-chart [fill="#ffffff"] {
  fill:#f6f6f6
}
.sequence-diagram [stroke="#000000"],.flow-chart [stroke="#000000"] {
  stroke:#3f3f3f
}
.sequence-diagram text[stroke="#000000"],.flow-chart text[stroke="#000000"] {
  stroke:none
}
.sequence-diagram [fill="#000"],.flow-chart [fill="#000"],.sequence-diagram [fill="#000000"],.flow-chart [fill="#000000"],.sequence-diagram [fill="black"],.flow-chart [fill="black"] {
  fill:#3f3f3f
}
ul,ol {
  margin-bottom:1.1em
}
ul ul,ol ul,ul ol,ol ol {
  margin-bottom:1.1em
}
kbd {
  padding:.1em .6em;
  border:1px solid rgba(63,63,63,0.25);
  -webkit-box-shadow:0 1px 0 rgba(63,63,63,0.25);
  box-shadow:0 1px 0 rgba(63,63,63,0.25);
  font-size:.7em;
  font-family:sans-serif;
  background-color:#fff;
  color:#333;
  border-radius:3px;
  display:inline-block;
  margin:0 .1em;
  white-space:nowrap
}
.toc ul {
  list-style-type:none;
  margin-bottom:15px
}
.m-todo-item {
  list-style: none;
}
pre code {
  padding: 0;
  color: inherit;
  white-space: pre-wrap;
  background-color: inherit;
  border-radius: 0;
}
</style>
<!-- 该css供自定义样式 -->
<link href="../leanote-markdown.css" rel="stylesheet">
</head>

<body>

	<div class="note-container">
		<h1 class="title" id="leanote-title">OSPF(Open Shortest Path First)</h1>
		<div class="content-container html" id="content-container">
			<!-- 切换 -->
			<div class="tab"><a id="tab-markdown">Markdown</a><a id="tab-html">HTML</a></div>
			<textarea id="leanote-content-markdown">[TOC]

----------

----------


- OSPF是一种链路状态型路由协议,即使网络中有环路,也能进行稳定的路由控制。
- OSPF支持子网掩码,实现可变长度子网构造的网络路由控制。
- 引入了“区域”的概念，将自治网络分为更小的范围，减少路由协议之间不必要的交换。

----------


## OSPF是链路状态型路由协议

OSPF为链路状态型路由器。路由器之间交换链路状态生成网络拓扑信息，然后再根据这个拓扑信息生成路由控制表。
![](OSPF-Open-Shortest-Path-First_files/59783fc8e0c358457b00000b.png)

![](OSPF-Open-Shortest-Path-First_files/59783fe4e0c358457b00000c.png)

RIP的路由选择，要求途中所经过的路由器个数越少越好。而OSPF可以给每条链路（实际上，可以为连到该数据链路[子网]的网卡设置一个代价，而这个代价只用于发送端，接收端不需要考虑）赋予一个权重（也叫代价），并始终选择一个权重最小的路径作为最终路由。就是说OSPF以每个链路上的代价作为度量标准，始终选择一个总的代价最小的一条路径。

> RIP是选择路由器个数最少的路径，而OSPF是选择总的代价较小的路径。

![](OSPF-Open-Shortest-Path-First_files/59784043e0c358457b00000d.png)

----------


## OSPF基础知识

在OSPF中，把连接到同一个链路的路由器称为相邻路由器（Neighboring Router）。在一个相对简单的网络结构中，例如每个路由器仅跟一个路由器互连接时（在专线网络中，路由器之间采用PPP相连），相邻路由器之间可以交换路由信息。但是在一个比较复杂的网络中，例如在同一个链路中加入了以太网或FDDI等路由器时，就不需要在所有相邻的路由器之间都进行控制信息的交换，而是确定一个指定路由器（Designated Router）并以它为中心交换路由信息即可。邻接路由器中相互交换路由信息的关系叫做邻接（Adjancency）。

RIP中包的类型只有一种。它利用路由控制信息，一边确认是否连接了网络，一边传送网络信息。但是这种方式的缺点，网络的个数越多，每次所要交换的路由控制信息就越大。而且当网络已经处于比较稳定的、没有什么变化的状态时，还要定期交换相同的路由控制信息，这在一定程度上浪费了带宽。

而在OSPF中，根据作用的不同可以分为5种类型的包：

|类型|包名|功能|
|---|---|---|
|1|问候(HELLO)|确定相邻路由器,确定指定的路由器|
|2|数据库描述(Database Sescription)|链路状态数据库的摘要信息|
|3|链路状态请求(Link State Request)|请求从数据库中获得链路状态信息|
|4|链路状态更新(Link State Update)|更新链路状态数据库中的链路状态信息|
|5|链路状态应答(Link State Aknowledgement)|两路状态信息更新的确认应答|

通过发送问候（HELLO）包确认是否连接。每个路由器为了同步路由控制信息，利用数据库描述（Database Description）包相互发送路由摘要信息和版本信息。如果版本比较老，则首先发出一个链路状态请求（Link State Request）包请求路由控制信息，然后由链路状态更新（Link State Update）包接收路由状态信息，最后再通过链路状态确认（Link State ACK packet）包通知大家本地已经接收到路由控制信息。

> 这样的机制，OSPF可以减少网络流量，还可以达到迅速更新路由信息的目的。

----------


## OSPF工作原理概述

OSPF中进行连接确认的协议叫做HELLO协议。
![](OSPF-Open-Shortest-Path-First_files/59784222e0c358457b00000e.png)

LAN中每10秒发送一个HELLO包。如果没有HELLO包到达，则进行连接是否断开判断（可自定义）。具体为，允许空等3次，直到第4次（40秒后）仍无任何反馈就认为连接已经断开。之后在进行连接断开或者恢复连接操作时，由于链路状态发生了变化，路由器会发送一个链路状态更新包（Link State Update Packet）通知其他路由器网络状态的变化。

链路状态更新包所要传达的消息大致分为两类：一是网络LSA（Network Link State Adevertisement），另一个是路由器LSA（Router Link State Adevertisement）。

网络LSA是以网络为中心生成的信息，表示这个网络与哪些路由器相连接。而路由器LSA是以路由器为中心生成的信息，表示这个路由器与哪些网络相连接。

如果这两种信息主要采用OSPF发送，每个路由器都可以生成一个可以表示网络结构的链路状态数据库。可以根据这个数据库、采用Digkstra算法（最短路径优先算法）生成相应的路由控制表。

相比距离向量，上述路由控制表更加清晰，还可以有效地减低无线循环问题的发生。不过，当网络规模逐渐越大时，最短路径优先算法的处理时间就会变得越长，对CPU和内存的消耗也就越大。

----------


## 将区域分层化进行细分管理

链路状态型路由协议的潜在问题在于，当网络规模越来越大时，表示链路状态的拓扑数据库就变得越来越大，路由控制信息的计算就越困难。OSPF为了减少计算负荷，引入了区域的概念。

区域是指将连接在一起的网络和主机划分成小组，使一个自治系统（AS）内可以拥有多个区域。不过具有多个区域的自治系统必须要有一个主干区域（Backhome Area）（主干区域的ID为0，逻辑上只允许它有1个，实际在物理上又可以划分为多个），并且所有其他区域都与这个主干区域相连接（如果网络的实际物理构造与此说明不符，需要采用OSPF的虚拟链路功能设置虚拟的主干或区域）。

连接区域与主干区域的路由器称作区域边界路由器；而区域内部的路由器叫做内部路由器；只与主干区域内连接的路由器叫做主干路由器；与外部相连接的路由器就是AS边界路由器。

![](OSPF-Open-Shortest-Path-First_files/597842a2e0c358457b00000f.png)


每个区域内的路由器都持有本区域网络拓扑的数据库。然而，关于区域之外的路径信息，只能从区域边界路由器那里获知它们的距离。区域边界路由器也不会将区域内的链路状态信息全部原样发给其他区域，只会发送自己到达这些路由器的距离信息，内部路由器所持有的网络拓扑数据库就会明显变小。

![](OSPF-Open-Shortest-Path-First_files/597842cee0c358457b000010.png)

换句话，就是指内部路由器只了解区域内部的链路状态信息，并在该信息的基础上计算出路由控制表。这种机制不仅可以有效地减少路由控制信息，还能减轻处理的负担。
![](OSPF-Open-Shortest-Path-First_files/59784302e0c358457b000011.png)

</textarea>
			<!-- markdown -->
			<pre class="content-markdown">[TOC]

----------

----------


- OSPF是一种链路状态型路由协议,即使网络中有环路,也能进行稳定的路由控制。
- OSPF支持子网掩码,实现可变长度子网构造的网络路由控制。
- 引入了“区域”的概念，将自治网络分为更小的范围，减少路由协议之间不必要的交换。

----------


## OSPF是链路状态型路由协议

OSPF为链路状态型路由器。路由器之间交换链路状态生成网络拓扑信息，然后再根据这个拓扑信息生成路由控制表。
![](OSPF-Open-Shortest-Path-First_files/59783fc8e0c358457b00000b.png)

![](OSPF-Open-Shortest-Path-First_files/59783fe4e0c358457b00000c.png)

RIP的路由选择，要求途中所经过的路由器个数越少越好。而OSPF可以给每条链路（实际上，可以为连到该数据链路[子网]的网卡设置一个代价，而这个代价只用于发送端，接收端不需要考虑）赋予一个权重（也叫代价），并始终选择一个权重最小的路径作为最终路由。就是说OSPF以每个链路上的代价作为度量标准，始终选择一个总的代价最小的一条路径。

> RIP是选择路由器个数最少的路径，而OSPF是选择总的代价较小的路径。

![](OSPF-Open-Shortest-Path-First_files/59784043e0c358457b00000d.png)

----------


## OSPF基础知识

在OSPF中，把连接到同一个链路的路由器称为相邻路由器（Neighboring Router）。在一个相对简单的网络结构中，例如每个路由器仅跟一个路由器互连接时（在专线网络中，路由器之间采用PPP相连），相邻路由器之间可以交换路由信息。但是在一个比较复杂的网络中，例如在同一个链路中加入了以太网或FDDI等路由器时，就不需要在所有相邻的路由器之间都进行控制信息的交换，而是确定一个指定路由器（Designated Router）并以它为中心交换路由信息即可。邻接路由器中相互交换路由信息的关系叫做邻接（Adjancency）。

RIP中包的类型只有一种。它利用路由控制信息，一边确认是否连接了网络，一边传送网络信息。但是这种方式的缺点，网络的个数越多，每次所要交换的路由控制信息就越大。而且当网络已经处于比较稳定的、没有什么变化的状态时，还要定期交换相同的路由控制信息，这在一定程度上浪费了带宽。

而在OSPF中，根据作用的不同可以分为5种类型的包：

|类型|包名|功能|
|---|---|---|
|1|问候(HELLO)|确定相邻路由器,确定指定的路由器|
|2|数据库描述(Database Sescription)|链路状态数据库的摘要信息|
|3|链路状态请求(Link State Request)|请求从数据库中获得链路状态信息|
|4|链路状态更新(Link State Update)|更新链路状态数据库中的链路状态信息|
|5|链路状态应答(Link State Aknowledgement)|两路状态信息更新的确认应答|

通过发送问候（HELLO）包确认是否连接。每个路由器为了同步路由控制信息，利用数据库描述（Database Description）包相互发送路由摘要信息和版本信息。如果版本比较老，则首先发出一个链路状态请求（Link State Request）包请求路由控制信息，然后由链路状态更新（Link State Update）包接收路由状态信息，最后再通过链路状态确认（Link State ACK packet）包通知大家本地已经接收到路由控制信息。

> 这样的机制，OSPF可以减少网络流量，还可以达到迅速更新路由信息的目的。

----------


## OSPF工作原理概述

OSPF中进行连接确认的协议叫做HELLO协议。
![](OSPF-Open-Shortest-Path-First_files/59784222e0c358457b00000e.png)

LAN中每10秒发送一个HELLO包。如果没有HELLO包到达，则进行连接是否断开判断（可自定义）。具体为，允许空等3次，直到第4次（40秒后）仍无任何反馈就认为连接已经断开。之后在进行连接断开或者恢复连接操作时，由于链路状态发生了变化，路由器会发送一个链路状态更新包（Link State Update Packet）通知其他路由器网络状态的变化。

链路状态更新包所要传达的消息大致分为两类：一是网络LSA（Network Link State Adevertisement），另一个是路由器LSA（Router Link State Adevertisement）。

网络LSA是以网络为中心生成的信息，表示这个网络与哪些路由器相连接。而路由器LSA是以路由器为中心生成的信息，表示这个路由器与哪些网络相连接。

如果这两种信息主要采用OSPF发送，每个路由器都可以生成一个可以表示网络结构的链路状态数据库。可以根据这个数据库、采用Digkstra算法（最短路径优先算法）生成相应的路由控制表。

相比距离向量，上述路由控制表更加清晰，还可以有效地减低无线循环问题的发生。不过，当网络规模逐渐越大时，最短路径优先算法的处理时间就会变得越长，对CPU和内存的消耗也就越大。

----------


## 将区域分层化进行细分管理

链路状态型路由协议的潜在问题在于，当网络规模越来越大时，表示链路状态的拓扑数据库就变得越来越大，路由控制信息的计算就越困难。OSPF为了减少计算负荷，引入了区域的概念。

区域是指将连接在一起的网络和主机划分成小组，使一个自治系统（AS）内可以拥有多个区域。不过具有多个区域的自治系统必须要有一个主干区域（Backhome Area）（主干区域的ID为0，逻辑上只允许它有1个，实际在物理上又可以划分为多个），并且所有其他区域都与这个主干区域相连接（如果网络的实际物理构造与此说明不符，需要采用OSPF的虚拟链路功能设置虚拟的主干或区域）。

连接区域与主干区域的路由器称作区域边界路由器；而区域内部的路由器叫做内部路由器；只与主干区域内连接的路由器叫做主干路由器；与外部相连接的路由器就是AS边界路由器。

![](OSPF-Open-Shortest-Path-First_files/597842a2e0c358457b00000f.png)


每个区域内的路由器都持有本区域网络拓扑的数据库。然而，关于区域之外的路径信息，只能从区域边界路由器那里获知它们的距离。区域边界路由器也不会将区域内的链路状态信息全部原样发给其他区域，只会发送自己到达这些路由器的距离信息，内部路由器所持有的网络拓扑数据库就会明显变小。

![](OSPF-Open-Shortest-Path-First_files/597842cee0c358457b000010.png)

换句话，就是指内部路由器只了解区域内部的链路状态信息，并在该信息的基础上计算出路由控制表。这种机制不仅可以有效地减少路由控制信息，还能减轻处理的负担。
![](OSPF-Open-Shortest-Path-First_files/59784302e0c358457b000011.png)

</pre>
			<!-- html -->
			<div class="content-html" id="leanote-content-html"></div>
		</div>
	</div>

<!-- 该js供其它处理 -->
<script src="../leanote-markdown.js"></script>
<script src="http://leanote.github.io/markdown-to-html/markdown-to-html.min.js"></script>
<script>
function init() {
	markdownToHtml(document.getElementById('leanote-content-markdown').value, document.getElementById('leanote-content-html'), function(html) {
		// 解析后执行
		if(window.markdownParsed) {
			window.markdownParsed(html);
		}
	});
	var $m = document.getElementById('tab-markdown');
	var $h = document.getElementById('tab-html');
	var $cc = document.getElementById('content-container');
	function toggleToHtml(isToHtml) {
		$cc.className = isToHtml ? 'content-container html' : 'content-container';
	}
	$m.addEventListener('click', function() {
		toggleToHtml(false);
	});
	$h.addEventListener('click', function() {
		toggleToHtml(true);
	});
}

// 如果不要自动解析html, notParseMarkdown在leanote-markdown.js中定义
if(!window.notParseMarkdown) {
	init();
}
</script>
</body>
</html>